﻿using ConfExpert.Forms.Base;
using DevTeam;

using System;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace ConfExpert.Forms.Destex.Satis
{
    public partial class Faturalar : XForm
    {
        public Faturalar()
        {
            InitializeComponent();
        }

        int FaturaId;
        public Faturalar(int faturaId)
        {
            InitializeComponent();
            FaturaId = faturaId;
        }

        private void Faturalar_Load(object sender, EventArgs e)
        {
            DataSet ds = ExecuteDataSet("DX_GetFaturalar", FaturaId);
            gv.Init(ds.Tables[0]);
            gv.SetCaptions("DX_FaturaId:Fatura No", "Notes:Notlar", "IskontoYuzde:İskonto (%)", "IskontoTutar:İskonto (tutar)");
            gv.AddDetailGrid(gvLines, "DX_FaturaId");

            if (FaturaId > 0)
                gv.ActiveFilterString = "DX_FaturaId = " + FaturaId;

            gvLines.MakeColumnInvisible("ProductId", "DtxPOLinesId");
            gvLines.SetCaptions("DX_FaturaLinesId:Satır No", "Qty:Metraj", "YeniFiyat:Fatura Fiyatı", "Article:Kumaş");
            gvLines.RowCellStyle += gv_RowCellStyle;

            gvLines.AddColumn("Toplam", typeof(decimal), "Qty*YeniFiyat");
            gv.AddColumn("Toplam", typeof(decimal), "(SUM(Child({FK}).Toplam) - isnull(IskontoTutar,0)) * (1-isnull(IskontoYuzde/100,0)) ");

            gv.FormatAsNumber(2, "Toplam");
            gvLines.FormatAsNumber(2, "Qty", "Toplam");

            gv.MakeReadOnly("Notes", "IskontoYuzde", "IskontoTutar");

            gvLines.MakeColumnInvisible("Tutar");
            gvLines.AddSummary("Toplam", "Qty");
            gvLines.MakeReadOnly("YeniFiyat");
            gv.BestFitColumns();
            gvLines.BestFitColumns();
        }

        void gv_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
        {
            if (new string[] { "YeniFiyat" }.Contains(e.Column.FieldName))
            {
                e.Appearance.BackColor = Color.LightYellow;
            }
        }


        private void btnKaydet_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            gv.Update("", "DX_Fatura");
        }



        private void btnRaporla_Click(object sender, EventArgs e)
        {
            int faturaId = gv.GetFocusedRowCellValue("DX_FaturaId").ToInt();
            DataSet ds = ExecuteDataSet("DX_GetFaturaReport", faturaId);

            DataRow drHeader = ds.Tables[0].Rows[0];
            DataTable dtDetail = ds.Tables[1];
            DataTable dtKur = ds.Tables[2];

            byte[] blob = (byte[])ExecuteScalar("DX_GetFaturaExcel");

            string path = FileManager.GetTempFolder("ce") + "DX_Fatura_" + faturaId.ToStr() + DateTime.Now.ToString("yyyyMMdd.HHmmss") + "temp.xlsx";

            File.WriteAllBytes(path, blob);


            string template = path;
            string destination = path.Replace("temp", "");


            int pageCount = 1;
            if (dtDetail.Rows.Count > 25)
            {
                pageCount = dtDetail.Rows.Count / 20;
                if (dtDetail.Rows.Count % 20 != 0)
                    pageCount++;
            }

            for (int j = 0; j < pageCount; j++)
            {
                destination = destination.Replace(".xlsx", "_" + (j + 1) + ".xlsx");
                string filter = "RN > " + j * 20 + " and RN < " + (((j + 1) * 20) + 1);

                if (pageCount == 1)
                    filter = "";

                DataTable dtParca = dtDetail.Select(filter).CopyToDataTable();

                SpreadsheetGear.IWorkbook wb = SpreadsheetGear.Factory.GetWorkbook(template);

                //string a1 = wb.Names["Unvan"].RefersToRange.Address;
                //wb.Worksheets[0].CopyAfter(wb.Worksheets[0]);
                //wb.Worksheets[0].EvaluateRange(a1).Cells[0, 0].Value = "deneme 1";
                //wb.Worksheets[1].EvaluateRange(a1).Cells[0, 0].Value = "deneme 2";

                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                    SetNameValue(wb, ds.Tables[0].Columns[i].ColumnName, drHeader[i]);

                for (int i = 0; i < dtParca.Rows.Count; i++)
                {
                    DataRow dr = dtParca.Rows[i];
                    wb.Worksheets[0].EvaluateRange("C" + (i + 20)).Cells[0, 0].Value = dr["Article"].ToStr();
                    wb.Worksheets[0].EvaluateRange("N" + (i + 20)).Cells[0, 0].Value = ((decimal)dr["Qty"]);
                    wb.Worksheets[0].EvaluateRange("Q" + (i + 20)).Cells[0, 0].Value = ((decimal)dr["Fiyat"]);
                    wb.Worksheets[0].EvaluateRange("Y" + (i + 20)).Cells[0, 0].Value = ((decimal)dr["Tutar"]);
                }

                SetNameValue(wb, "DovizKuru1", dtKur.Rows[0]["Kur"]);

                if (dtKur.Rows.Count == 2)
                    SetNameValue(wb, "DovizKuru2", dtKur.Rows[1]["Kur"]);
                else
                    SetNameValue(wb, "DovizKuru2", "");


                decimal toplam = wb.Names["Toplam"].RefersToRange.Cells[0, 0].Value.ToDecimal();
                SetNameValue(wb, "TutarYazi", yaziyaCevir(toplam));

                wb.SaveAs(destination, SpreadsheetGear.FileFormat.OpenXMLWorkbook);
                FileManager.RunFile(destination);
            }

            if (pageCount > 1)
                ShowInfoMessage(pageCount + " adet fatura oluştu. Lütfen dikkat edin.");
        }

        private string yaziyaCevir(decimal tutar)
        {
            string sTutar = tutar.ToString("F2").Replace('.', ','); // Replace('.',',') ondalık ayracının . olma durumu için            
            string lira = sTutar.Substring(0, sTutar.IndexOf(',')); //tutarın tam kısmı
            string kurus = sTutar.Substring(sTutar.IndexOf(',') + 1, 2);
            string yazi = "";

            string[] birler = { "", "BİR", "İKİ", "ÜÇ", "DÖRT", "BEŞ", "ALTI", "YEDİ", "SEKİZ", "DOKUZ" };
            string[] onlar = { "", "ON", "YİRMİ", "OTUZ", "KIRK", "ELLİ", "ALTMIŞ", "YETMİŞ", "SEKSEN", "DOKSAN" };
            string[] binler = { "KATRİLYON", "TRİLYON", "MİLYAR", "MİLYON", "BİN", "" }; //KATRİLYON'un önüne ekleme yapılarak artırabilir.

            int grupSayisi = 6; //sayıdaki 3'lü grup sayısı. katrilyon içi 6. (1.234,00 daki grup sayısı 2'dir.)
            //KATRİLYON'un başına ekleyeceğiniz her değer için grup sayısını artırınız.

            lira = lira.PadLeft(grupSayisi * 3, '0'); //sayının soluna '0' eklenerek sayı 'grup sayısı x 3' basakmaklı yapılıyor.            

            string grupDegeri;

            for (int i = 0; i < grupSayisi * 3; i += 3) //sayı 3'erli gruplar halinde ele alınıyor.
            {
                grupDegeri = "";

                if (lira.Substring(i, 1) != "0")
                    grupDegeri += birler[Convert.ToInt32(lira.Substring(i, 1))] + "YÜZ"; //yüzler                

                if (grupDegeri == "BİRYÜZ") //biryüz düzeltiliyor.
                    grupDegeri = "YÜZ";

                grupDegeri += onlar[Convert.ToInt32(lira.Substring(i + 1, 1))]; //onlar

                grupDegeri += birler[Convert.ToInt32(lira.Substring(i + 2, 1))]; //birler                

                if (grupDegeri != "") //binler
                    grupDegeri += binler[i / 3];

                if (grupDegeri == "BİRBİN") //birbin düzeltiliyor.
                    grupDegeri = "BİN";

                yazi += grupDegeri;
            }

            if (yazi != "")
                yazi += " TL ";

            int yaziUzunlugu = yazi.Length;

            if (kurus.Substring(0, 1) != "0") //kuruş onlar
                yazi += onlar[Convert.ToInt32(kurus.Substring(0, 1))];

            if (kurus.Substring(1, 1) != "0") //kuruş birler
                yazi += birler[Convert.ToInt32(kurus.Substring(1, 1))];

            if (yazi.Length > yaziUzunlugu)
                yazi += " Kr.";
            else
                yazi += "SIFIR Kr.";

            return yazi;
        }

        public void SetNameValue(SpreadsheetGear.IWorkbook wb, string name, object val)
        {
            wb.Names[name].RefersToRange.Cells[0, 0].Value = val.ToStr();
        }

        private void btnIndir_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Excel Dosyaları|*.xlsx";
            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                byte[] sablon = (byte[])ExecuteDataTable("DX_GetSablon").Rows[0][0];
                File.WriteAllBytes(sfd.FileName, sablon);
                FileManager.RunFile(sfd.FileName);
            }
        }

        private void btnYukle_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Excel Dosyaları|*.xlsx";
            ofd.Multiselect = false;
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                ExecuteNonQuery("DX_UpdSablon", File.ReadAllBytes(ofd.FileName));
            }
        }
    }
}
